package co.yixiang.modules.order.cart.render.impl;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import co.yixiang.cache.Cache;
import co.yixiang.common.enums.PromotionTypeEnum;
import co.yixiang.common.enums.ResultCode;
import co.yixiang.common.exception.ServiceException;
import co.yixiang.common.utils.CurrencyUtil;
import co.yixiang.modules.member.service.YxUserService;
import co.yixiang.modules.order.cart.entity.dto.TradeDTO;
import co.yixiang.modules.order.cart.entity.enums.RenderStepEnums;
import co.yixiang.modules.order.cart.entity.vo.CartSkuVO;
import co.yixiang.modules.order.cart.entity.vo.CartVO;
import co.yixiang.modules.order.cart.render.CartRenderStep;
import co.yixiang.modules.order.order.entity.dto.PriceDetailDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 购物促销信息渲染实现
 *
 * @author Chopper
 * @since 2020-07-02 14:47
 */
@Service
public class SkuPromotionRender implements CartRenderStep {







    @Autowired
    private YxUserService memberService;

    @Autowired
    private Cache cache;

    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.SKU_PROMOTION;
    }

    @Override
    public void render(TradeDTO tradeDTO) {

        //基础价格渲染
        renderBasePrice(tradeDTO);
        //渲染单品促销
        renderSkuPromotion(tradeDTO);


    }

    /**
     * 基础价格渲染
     *
     * @param tradeDTO
     */
    private void renderBasePrice(TradeDTO tradeDTO) {
        tradeDTO.getCartList().forEach(
                cartVO -> cartVO.getCheckedSkuList().forEach(cartSkuVO -> {
                    PriceDetailDto priceDetailDTO = cartSkuVO.getPriceDetailDto();
                    priceDetailDTO.setGoodsPrice(cartSkuVO.getSubTotal());
                    priceDetailDTO.setDiscountPrice(CurrencyUtil.sub(priceDetailDTO.getTotalPrice(), cartSkuVO.getSubTotal()));
                })
        );
    }


    /**
     * 渲染单品优惠 积分/拼团/秒杀/砍价
     *
     * @param tradeDTO 购物车视图
     */
    private void renderSkuPromotion(TradeDTO tradeDTO) {


        switch (tradeDTO.getCartTypeEnum()) {

            //这里是双重循环，但是实际积分购买或者是砍价购买时，购物车只有一个商品，所以没有循环操作数据库或者其他的问题
//            case POINTS:
//                // Member userInfo = memberService.getUserInfo();
//                long totalPayPoints = 0;
//                //处理积分商品购买
//                for (CartVO cartVO : tradeDTO.getCartList()) {
//                    for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) {
//                        cartSkuVO.getPriceDetailDto().setPayPoint(cartSkuVO.getPoint());
//                        PromotionSkuVO promotionSkuVO = new PromotionSkuVO(PromotionTypeEnum.POINTS_GOODS.name(), cartSkuVO.getPointsId());
//                        cartSkuVO.getPriceDetailDTO().getJoinPromotion().add(promotionSkuVO);
//                        totalPayPoints += cartSkuVO.getPoint();
//                    }
//                }
//                // userInfo.getPoint() < totalPayPoints
//                if (0 < totalPayPoints) {
//                    throw new ServiceException(ResultCode.POINT_NOT_ENOUGH);
//                }
//                return;
            case CART:
            case BUY_NOW:
            case ADOPT:
            case VIRTUAL:
                //循环购物车
                for (CartVO cartVO : tradeDTO.getCartList()) {
                    //循环sku
                    for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) {
                        cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum()));
                        cartSkuVO.getPriceDetailDto().setGoodsPrice(cartSkuVO.getSubTotal());
                    }
                }
                return;
            default:
        }
    }
}
